/**
 * Copyright 1996 self.com.au
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License. (http://www.apache.org/licenses/LICENSE-2.0)
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed 
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for 
 * the specific language governing permissions and limitations under the License.
 *
 * <dhamma-message src="Atisha (11th century Tibetan Buddhist master)">
 * 	The greatest achievement is selflessness. The greatest worth is self-mastery.
 * 	The greatest quality is seeking to serve others. The greatest precept is continual awareness.
 * 	The greatest medicine is the emptiness of everything. The greatest action is not conforming with the worlds ways.
 * 	The greatest magic is transmuting the passions. The greatest generosity is non-attachment.
 * 	The greatest goodness is a peaceful mind. The greatest patience is humility.
 * 	The greatest effort is not concerned with results. The greatest meditation is a mind that lets go.
 * 	The greatest wisdom is seeing through appearances. 
 * </dhamma-message>
 *
 * @author Ashin Wimalajeewa
 *
 * Note, this is a very old runtime library that I have evolved since 1996. I rarely use it
 * now because the Apache Commons project has made it obsolete.
 */
package self.util.zip;

import java.io.*;
import java.util.zip.*;

public class ZipDirectoryInflator {
  private byte[] buff;
  private String startFrom;
  private boolean inclSubs;
  private String outputZipName;
  private ZipOutputStream output;
  private int startFromLen;

  public ZipDirectoryInflator( int sz, String start, boolean inc, String outZipFile ) {
    buff = new byte[sz];
    startFrom = start;
    startFromLen = startFrom.length();
    inclSubs = inc;
    outputZipName = outZipFile;
  }

  public void run( EntryConfigurationListener callback ) throws IOException {
    FileOutputStream fos = new FileOutputStream( outputZipName );
    output = new ZipOutputStream( fos );
    try {
      File curr = new File( startFrom );
      zipDirectory( curr, callback );
    } finally {
      output.close();
    }
  }

  private void zipDirectory( File curr, EntryConfigurationListener callback ) throws IOException {
    File[] files = curr.listFiles();
    for ( int cntr = 0; cntr < files.length; cntr++ ) {
      if ( files[cntr].isDirectory() ) {
        if ( inclSubs )
          zipDirectory( files[cntr], callback );
      } else
        addFileToZip( files[cntr], callback );
    }
  }

  private void addFileToZip( File file, EntryConfigurationListener callback ) throws IOException {
    String abs = file.getAbsolutePath();
    abs = abs.substring( startFromLen + 1 );
    ZipEntry entry = new ZipEntry( abs );
    if ( callback != null )
      callback.configure( entry );
    output.putNextEntry( entry );
    try {
      FileInputStream fis = new FileInputStream( file );
      BufferedInputStream bis = new BufferedInputStream( fis, 2048 );
      try {
        int readIn;
        while ( (readIn = bis.read(buff)) > 0 )
          output.write( buff, 0, readIn );
      } finally {
        bis.close();
      }
    } finally {
      output.closeEntry();
    }
  }

  static public void main( String[] args ) throws Exception {
//    "d:/aid/crawl/714138",
//    true,
//    "d:/aid/crawl/714138.zip" );
    ZipDirectoryInflator test = new ZipDirectoryInflator( 512000,
                                                          "C:/localdata/cAID/gs.v4.testdata/will",
                                                          true,
                                                          "C:/localdata/cAID/test.zip" );
    test.run( null );
  }
}